function querystringify(obj) {
  let str = ''
  for (let k in obj) {
    str += `${ k }=${ obj[k] }&`
  }
  return str.slice(0, -1)
}

function createAjax() {
  function ajax(options = {}) {
    if (!options.url) throw new Error('url 是必填选项, 请填写后再试')
    if (!(options.method === undefined || /^(GET|POST)$/i.test(options.method))) {
      throw new Error('目前请求方式仅支持 GET 和 POST, 请期待更新 ^_^')
    }
    if (!(options.async === undefined || typeof options.async === 'boolean')) {
      throw new Error('async 需要填写一个 布尔值(Boolean)')
    }
    if (!(options.data === undefined || typeof options.data === 'string' || options.data.constructor === Object)) {
      throw new Error('data 参数需要是一个 字符串(String) 或者 对象(Object) 数据类型')
    }
    if (!(options.headers === undefined || options.headers.constructor === Object)) {
      throw new Error('headers 需要是一个 对象(Object) 数据结构')
    }
    if (!(options.dataType === undefined || /^(string|json)$/i.test(options.dataType))) {
      throw new Error('dataType 只能填写 "string" 或者 "json"')
    }
    const _default = {
      url: options.url,
      method: options.method || 'GET',
      async: options.async ?? true,
      data: options.data || '',
      headers: { 'content-type': 'application/x-www-form-urlencoded', ...options.headers },
      dataType: options.dataType || 'string'
    }
    if (typeof _default.data === 'object') _default.data = querystringify(_default.data)
    if (/^GET$/i.test(_default.method) && _default.data) _default.url += '?' + _default.data
    const p = new Promise((resolve, reject) => {
      const xhr = new XMLHttpRequest()
      xhr.open(_default.method, _default.url, _default.async)
      xhr.onload = function () {
        if (_default.dataType === 'string') {
          resolve({ code: 1, message: '成功', info: xhr.responseText })
          return
        }
        try {
          const res = JSON.parse(xhr.responseText)
          resolve({ code: 1, message: '成功', info: res })
        } catch(err) {
          resolve({ code: 0, message: '失败', info: err })
        }
      }
      if (/^POST$/i.test(_default.method)) xhr.setRequestHeader('content-type', _default.headers['content-type'])
      if (_default.headers.authorization) xhr.setRequestHeader('authorization', _default.headers.authorization)
      ;/^POST$/i.test(_default.method) ? xhr.send(_default.data) : xhr.send()
    })
    return p
  }
  return ajax
}

export const ajax = createAjax()